package org.springmvc.web.servlet.mvc.method.annotation;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springmvc.ui.ModelMap;
import org.springmvc.web.method.HandlerMethod;
import org.springmvc.web.servlet.HandlerAdapter;
import org.springmvc.web.servlet.ModelAndView;

import java.lang.reflect.Method;

/**
 * @author marin
 * @version 1.0
 * @date 2025/9/1 19:54
 * @desc 处理适配器 专门为@RequestMapping注解服务处理的
 */
@SuppressWarnings("all")
public class RequestMappingHandlerAdapter implements HandlerAdapter {
    @Override
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //需要调用处理器方法
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        //获取controller对象
        Object controller = handlerMethod.getHandler();
        //获取处理器方法
        Method method = handlerMethod.getMethod();
        // 通过反射机制调用方法
        // 我们自己写的springmvc框架，有一个特的要求，要求ControLLer类中方法必须有ModeLMap参数
        // 我们自己写的springmvc框架，还有一个特的歌求，要求Controller类中方法必须返回String逻辑视图名称
        ModelMap modelMap = new ModelMap();
        String viewName = (String)method.invoke(controller,modelMap);

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setModel(modelMap);
        modelAndView.setView(viewName);
        return modelAndView;
    }
}
